package com.hdu;

import java.text.SimpleDateFormat;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;

/**
 * 时间轮工厂 : 创建时间轮
 */
public class TimerFactory {

    public static void main(String[] args) {
        SystemTimer timer = createSystemTimer("test", 200, TimeUnit.MILLISECONDS, 5);
        for (int i = 0; i < 10; i++) {
            try {
                TimeUnit.SECONDS.sleep(2);
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String curTimeStr = sdf.format(System.currentTimeMillis());
                System.out.println("时间 ：" + curTimeStr + "：提交第 " + (i + 1) + " 个任务");
                final int j = i + 1;
                timer.add(
                        new TimerTask(2, TimeUnit.SECONDS) {
                            @Override
                            public void run() {
                                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                                String curTimeStr = sdf.format(System.currentTimeMillis());
                                System.out.println("时间 ：" + curTimeStr + "：第 " + (j) + " 个任务开始执行完毕");
                            }
                        }
                );
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
        //时间 ：2024-08-12 23:43:47：提交第 1 个任务
        //时间 ：2024-08-12 23:43:49：第 1 个任务开始执行完毕
        //时间 ：2024-08-12 23:43:49：提交第 2 个任务
        //时间 ：2024-08-12 23:43:51：第 2 个任务开始执行完毕
        //时间 ：2024-08-12 23:43:51：提交第 3 个任务
        //时间 ：2024-08-12 23:43:53：第 3 个任务开始执行完毕
        //时间 ：2024-08-12 23:43:53：提交第 4 个任务
        //时间 ：2024-08-12 23:43:55：第 4 个任务开始执行完毕
        //时间 ：2024-08-12 23:43:55：提交第 5 个任务
        //时间 ：2024-08-12 23:43:57：第 5 个任务开始执行完毕
        //时间 ：2024-08-12 23:43:57：提交第 6 个任务
        //时间 ：2024-08-12 23:43:59：第 6 个任务开始执行完毕
        //时间 ：2024-08-12 23:43:59：提交第 7 个任务
        //时间 ：2024-08-12 23:44:01：第 7 个任务开始执行完毕
        //时间 ：2024-08-12 23:44:01：提交第 8 个任务
        //时间 ：2024-08-12 23:44:03：第 8 个任务开始执行完毕
        //时间 ：2024-08-12 23:44:03：提交第 9 个任务
        //时间 ：2024-08-12 23:44:05：第 9 个任务开始执行完毕
        //时间 ：2024-08-12 23:44:05：提交第 10 个任务
        //时间 ：2024-08-12 23:44:07：第 10 个任务开始执行完毕
    }

    /**
     * 创建时间轮
     * @param timerName 时间轮名
     * @param tickMs 时间轮的时间间隔
     * @param timeUnit 时间轮的时间间隔单位
     * @param wheelSize 时间轮大小
     * @return
     */
    public static SystemTimer createSystemTimer(String timerName, long tickMs, TimeUnit timeUnit, int wheelSize) {
        SystemTimer systemTimer = new SystemTimer(timerName, timeUnit.toMillis(tickMs), wheelSize, System.currentTimeMillis());
        ExecutorService executorService = Executors.newFixedThreadPool(1, new ThreadFactory() {
            @Override
            public Thread newThread(Runnable r) {
                return new Thread(r, "timer-" + timerName);
            }
        });
        // 驱动时间轮向前的线程
        executorService.submit(() -> {
            systemTimer.advanceClock();
        });
        return systemTimer;
    }

}
